package com.moxi.mogublog.sms.util;

import com.aliyuncs.CommonRequest;
import com.aliyuncs.CommonResponse;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsRequest;
import com.aliyuncs.dysmsapi.model.v20170525.QuerySendDetailsResponse;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.moxi.mogublog.sms.config.SmsProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类，直接通过
 * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
 * 工程依赖了2个jar包(存放在工程的libs目录下)
 * 1:aliyun-java-sdk-core.jar
 * 2:aliyun-java-sdk-dysmsapi.jar
 * <p>
 * 备注:Demo工程编码采用UTF-8
 * 国际短信发送请勿参照此DEMO
 *
 * @author LiShuai
 * @date 2020/5/27 10:08
 */
@Component
public class SmsUtil {

    private final static Logger log = LoggerFactory.getLogger(SmsUtil.class);

    /**
     * 产品名称:云通信短信API产品,开发者无需替换
     */
    public static final String PRODUCT = "Dysmsapi";

    /**
     * 产品域名,开发者无需替换
     */
    public static final String DOMAIN = "dysmsapi.aliyuncs.com";

    @Autowired
    private SmsProperties smsProperties;

//    /**
//     * 是否发送短信:false-不发送(默认)，true-发送；
//     */
//    @Value(value = "${ali.sms.isOpen:false}")
//    private boolean isOpen;
//
//    @Value(value = "${ali.sms.accessKeyId}")
//    private String accessKeyId;
//
//    @Value(value = "${ali.sms.accessKeySecret}")
//    private String accessKeySecret;

    //@Autowired
    //private Environment env;

    // TODO 此处需要替换成开发者自己的AK(在阿里云访问控制台寻找)
    //String accessKeyId = env.getProperty("accessKeyId");
    //String accessKeySecret = env.getProperty("accessKeySecret");

    public CommonResponse sendSms(String mobile, String templateCode, String signName, String param) throws ClientException {
        if (smsProperties.isOpen()) {
            // 设置阿里短信的前置参数
            IAcsClient acsClient = setSmsParam();
            // 组装请求对象-具体描述见控制台-文档部分内容
            CommonRequest request = new CommonRequest();
            request.setMethod(MethodType.POST);
            request.setDomain(DOMAIN);
            request.setVersion("2017-05-25");
            request.setAction("SendSms");
            request.putQueryParameter("RegionId", "cn-hangzhou");
            //必填:待发送手机号
            request.putQueryParameter("PhoneNumb" + "ers", mobile);
            //必填:短信签名-可在短信控制台中找到
            request.putQueryParameter("SignName", signName);
            //必填:短信模板-可在短信控制台中找到
            request.putQueryParameter("TemplateCode", templateCode);
            //可选:模板中的变量替换JSON串,如模板内容为"亲爱的${name},您的验证码为${code}"时,此处的值为
            request.putQueryParameter("TemplateParam", param);
            //hint 此处可能会抛出异常，注意catch
            CommonResponse commonResponse = acsClient.getCommonResponse(request);
            return commonResponse;
        } else {
            log.info("短信开关处于关闭状态，即不发送短信");
            return null;
        }
    }

    public QuerySendDetailsResponse querySendDetails(String mobile, String bizId) throws ClientException {
        // 设置阿里短信的前置参数
        IAcsClient acsClient = setSmsParam();
        //组装请求对象
        QuerySendDetailsRequest request = new QuerySendDetailsRequest();
        //必填-号码
        request.setPhoneNumber(mobile);
        //可选-流水号
        request.setBizId(bizId);
        //必填-发送日期 支持30天内记录查询，格式yyyyMMdd
        SimpleDateFormat ft = new SimpleDateFormat("yyyyMMdd");
        request.setSendDate(ft.format(new Date()));
        //必填-页大小
        request.setPageSize(10L);
        //必填-当前页码从1开始计数
        request.setCurrentPage(1L);
        //hint 此处可能会抛出异常，注意catch
        QuerySendDetailsResponse querySendDetailsResponse = acsClient.getAcsResponse(request);
        return querySendDetailsResponse;
    }

    /**
     * 设置阿里短信的前置参数
     *
     * @return
     * @throws ClientException
     */
    private IAcsClient setSmsParam() throws ClientException {
        //可自助调整超时时间
        System.setProperty("sun.net.client.defaultConnectTimeout", "10000");
        System.setProperty("sun.net.client.defaultReadTimeout", "10000");
        //初始化acsClient,暂不支持region化
        IClientProfile profile = DefaultProfile.getProfile("cn-hangzhou", smsProperties.getAccessKeyId(), smsProperties.getAccessKeySecret());
        DefaultProfile.addEndpoint("cn-hangzhou", "cn-hangzhou", PRODUCT, DOMAIN);
        IAcsClient acsClient = new DefaultAcsClient(profile);
        return acsClient;
    }

}
